package me.sdevil507.org.service;

import me.sdevil507.biz.common.exceptions.PhoneNumberExistedException;
import me.sdevil507.biz.common.exceptions.UserExistedException;
import me.sdevil507.org.dto.OrgInviteParamsDto;
import me.sdevil507.org.po.OrgInvitePo;
import me.sdevil507.org.po.OrgUserRelPo;
import me.sdevil507.supports.jpa.PageParamsDTO;
import me.sdevil507.supports.jpa.SortParamsDTO;
import org.springframework.data.domain.Page;

/**
 * 邀请记录表[OrgInviteService]
 *
 * @author sdevil507
 * created on 2020-08-13 11:39:50
 */
public interface OrgInviteService {

    /**
     * 分页获取记录
     *
     * @param searchParamsDto 查询DTO
     * @param pageParamsDto   分页DTO
     * @param sortParamsDto   排序DTO
     * @return 分页记录
     */
    Page<OrgInvitePo> readAllByPage(OrgInviteParamsDto searchParamsDto, PageParamsDTO pageParamsDto, SortParamsDTO sortParamsDto);

    /**
     * 生成邀请链接
     *
     * @param dto 入参
     * @return 邀请链接
     */
    Long inviteUrl(OrgInviteParamsDto dto);

    /**
     * 根据id获取邀请记录
     *
     * @param id id
     * @return 邀请记录
     */
    OrgInvitePo readInvite(Long id);

    /**
     * 根据手机号码,姓名 判断邀请记录是否存在
     *
     * @param phoneNumber 手机号码
     * @param realName 姓名
     */
    OrgInvitePo existedInviteRecord(String phoneNumber, String realName) ;

    /**
     * 根据手机号码判断专家是否存在
     *
     * @param phoneNumber 手机号码
     * @throws UserExistedException        用户在机构下存在
     * @throws PhoneNumberExistedException 用户在机构下不存在,但在主数据库中存在
     */
    void existed(String phoneNumber) throws UserExistedException, PhoneNumberExistedException;

    /**
     * 邀请注册
     *
     * @param id 邀请记录id
     */
    void register(Long id);

    /**
     * 绑定用户至该智库
     *
     * @param id 邀请记录id
     */
    void bindOrg(Long id);

    /**
     * 拒绝邀请
     *
     * @param id 邀请记录id
     */
    void reject(Long id);

    /**
     * 删除临时专家记录
     *
     * @param id 邀请记录id
     */
    void removeTemp(Long id);

    OrgUserRelPo getRel(String phoneNumber, Long orgId);
}